package com.soyotec.algorithm.solution;

import com.soyotec.algorithm.value.Limit;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 解决方案接口
 *
 * @param <V,O,C>
 */
public interface Solution<V,O,C> extends Serializable {

    /**
     * 设置目标
     *
     * @param var1 下标索引
     * @param var2 目标取值
     */
    void setObjective(int var1, O var2);

    /**
     * 设置约束
     *
     * @param var1 下标索引
     * @param var2 约束取值
     */
    void setConstraint(int var1, C var2);

    /**
     * 获取目标函数取值
     *
     * @param var1 下标索引
     * @return 目标函数取值
     */
    O getObjective(int var1);

    /**
     * 获取约束条件取值
     *
     * @param var1 下标索引
     * @return 约束条件取值
     */
    C getConstraint(int var1);

    /**
     * 获取目标函数值数组
     *
     * @return 目标函数值数组
     */
    O[] getObjectives();

    /**
     * 获取约束条件值数组
     *
     * @return 约束条件值数组
     */
    C[] getConstraints();

    C[] getConstraintRealValue();

    C getConstraintRealValue(int index);

    void setConstraintRealValue(int var1, C var2);

    /**
     * 获取设计变量取值
     *
     * @param var1 下标索引
     * @return 设计变量取值
     */
    V getVariableValue(int var1);

    V getRealTypeVariable(int var1);

    void setRealTypeVariable(int var1, V var2);

    List<V> getRealTypeVariables();

    /**
     * 获取设计变量集合
     *
     * @return 设计变量集合
     */
    List<V> getVariables();

    /**
     * 设置设计变量取值
     *
     * @param var1 下标索引
     * @param var2 设计变量取值
     */
    void setVariableValue(int var1, V var2);

    /**
     * 获取设计变量取值
     *
     * @param var1 下标索引
     * @return 设计变量取值
     */
    String getVariableValueString(int var1);

    /**
     * 获取设计变量个数
     *
     * @return 设计变量个数
     */
    int getNumberOfVariables();

    /**
     * 获取目标函数个数
     *
     * @return 目标函数个数
     */
    int getNumberOfObjectives();

    /**
     * 获取约束条件个数
     *
     * @return 约束条件个数
     */
    int getNumberOfConstraints();

    /**
     * 拷贝当前解决方案
     *
     * @return 拷贝后的解决方案
     */
    Solution<V,O,C> copy();

    /**
     * 设置解决方案属性
     *
     * @param var1 属性名称
     * @param var2 属性值
     */
    void setAttribute(Object var1, Object var2);

    /**
     * 获取解决方案一个属性
     *
     * @param var1 属性名称
     * @return 属性值
     */
    Object getAttribute(Object var1);

    /**
     * 获取解决方案所有属性
     *
     * @return 解决方案所有属性
     */
    Map<Object, Object> getAttributes();
    Limit getVariableLimit(int var1);
    Limit getConstraintLimit(int var1);

    double getObjectiveAndPenalty();

    boolean isFeasible();

    boolean isExecFlag();

    double getPenalty();

    double getObjective();

    String getAlgorithmName();

    Integer getArrayDimension();
}